import mysql, {OkPacket, QueryFunction, MysqlError, PoolConnection} from 'mysql'
import { MYSQL_CONF } from '../config/db';


const pool = mysql.createPool(MYSQL_CONF)
// 是否可以链接数据池
pool.getConnection((err:MysqlError, conn: PoolConnection)=>{
    if (err) {
        console.error('error connecting: ' + err.stack);
        return;
    }
    
    console.log('mysql pool connected as id ' + conn.threadId);
})
class mysql_trans{
    // 事务处理
    trans(tran:(conn:PoolConnection) => ReturnType<(conn:PoolConnection, queryStr:string)=>Promise<any>> ){
        return new Promise((resolve, reject) => {
            pool.getConnection((err:MysqlError, conn: PoolConnection) => {
                if(err){
                    reject(err)
                    return
                }
                //开始事务处理 ,可以被提交(committed)或者回滚(rolled back)
                conn.beginTransaction((err) => {
                    if(err){
                        conn.release()
                        reject(err)
                        return
                    }
                    let tranPromise = tran(conn)
                    tranPromise.then(result => {
                        console.log('数据库被提交')
                        // 被提交
                        conn.commit((err:any) => {
                            
                            if(err) {
                                reject(err)
                                return
                            }
                            resolve(result)
                        })
                    }).catch(err => {
                        console.log('数据库回滚')
                        //事务处理函数reject则回滚事务
                        conn.rollback(() => {
                            //当一个连接不需要使用时，使用该方法将其归还到连接池中
                            conn.release()
                            reject(err)
                        })
                    })
    
                })
            })
        })
    }

    // 事务查询 
    query(conn:PoolConnection, sql:string, params:any={}):Promise<any>{
        return new Promise((resolve, reject) => {
            try {
                (conn.query as QueryFunction)(sql, params, (err, res) => {
                    if(err){
                        reject(err)
                    } else {
                        resolve(res)
                    }
                })
            } catch(err){
                reject(err)
            }
            
        })
    }
}

export const newMysqlTrans= new mysql_trans()

// 新建查询连接
export function querySql(sql:string, addParams:any={}):Promise<any> {
    return new Promise((resolve, reject) => {
        pool.getConnection((err:MysqlError, conn: PoolConnection)=>{
            if (err) {
                console.error('error connecting: ' + err.stack);
                return;
            }
            try {
                (conn.query as QueryFunction)(sql, addParams, (err, res) => {
                    if(err) {
                        reject(err)
                    } else {
                        resolve(res)
                    }
                })
            }catch(err) {
                reject(err)
            }
        })
    })
    
}
// 链接mysql数据库
// const createConnect = mysql.createConnection(MYSQL_CONF)

// createConnect.connect(function(err) {
//     if (err) {
//         console.error('error connecting: ' + err.stack);
//         return;
//     }
//     console.log('connected as id ' + createConnect.threadId);
// })